Table of Contents
本次探索源于上次发现可以使用Docker来管理群晖虚拟机,而绿联本身是自带kvm内核模块的,但是要等到绿联官方支持虚拟机,又不知道会等到猴年马月。所以我有一个大胆的想法,能否使用Docker搭建一个可以自由管理虚拟机的程序,最起码可以安装一个windows替换掉绿联内置的有着各种限制的迅雷
注意:非专业人士请勿模仿,除非你知道什么是KVM,在此期间所造成的系统风险请自行承担
虚拟机管理
选择了我之前使用过的 retspen/webvirtcloud 来管理 KVM
,说实话,这个管理程序比起威联通群晖这些官方自带确实不太好用,但用于测试还是足够了,如果有更好更方便的推荐请在评论区留言
retspen/webvirtcloud 没有官方的 Docker
镜像,只能自己编译,虽然它本身带有一个 Dockerfile,但如果自己构建会遇到各种各样的问题,下面是我遇到的部分问题
Ubuntu版本问题
retspen/webvirtcloud 默认是基于一个 Ubuntu22.04 的镜像构建,但是,如果自行构建会发现旧版本的 Docker 和 Ubuntu22.04 根本不兼容
-
报错一
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 871920D1991BC93C
-
报错二
/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg are ignored as the file is not readable by user '_apt' executing apt-key.
这个报错可以通过删除gpg文件忽略,但实际上没什么用。
真正的解决方式是升级自身的Docker版本,最小要到 20.0
以上,因为我使用的Mac,最新版本的Docker也不过是 19.03.13
,所以没办法使用升级Docker的方式解决,只能降级Ubuntu的版本
一开始我直接把版本降到最熟悉的18.04,但在安装Python库发现部分库的指定版本要求Python3.8,否则找不到指定版本
如果使用 apt
直接安装 Python3.8
,会发现有两个问题:
-
其中一个依赖
python3-lxml
没有3.8的版本,直接安装会同时安装Python3.6
-
venv
无法使用
后面甚至想要忽略Python版本强行安装
pip3 install -r conf/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com --ignore-requires-python
所以再次测试升级到 20.04 的版本,还好 20.04 安装的Python3正是 Python3.8
,故此正常
Libvirt安装依赖
由于 retspen/webvirtcloud 是依赖libvirt对虚拟机进行管理的,而绿联使用的系统本身没有libvirt进程,所以我将在Docker内部安装,在此期间也遇到了部分问题,下面对部分依赖包统一说明一下
-
libvirt-daemon
libvirtd的进程包 -
libvirt-daemon-system
libvirtd的默认配置包,如果不安装需要手动编写配置 -
iptables
libvirtd的依赖,不安装启动libvirtd时会报错 -
dnsmasq
libvirtd的依赖,不安装kvm的默认网络无法启动,导致后续建立的虚拟机无法联网 -
qemu-kvm
不安装导致后续新建虚拟机时可选的架构和芯片组为空 -
qemu-utils
不安装导致虚拟机无法使用qcow2,只能使用raw格式 -
virt-manager(可选)
通过命令行管理虚拟机
构建Docker
修改完 Ubuntu版本 和添加 KVM所需依赖 后,就能成功构建Docker(实际构建大小在1.4G左右)。
导入镜像
-
首先先导出镜像
docker save -o webvirtcloud.tar webvirtcloud:test-2
ssh登录
老传统了,这里就不再过多叙述,具体可看 绿联DX4600 Pro禁用迅雷和中国移动云盘进程 绿联云Nas新版本v3.4.0固件开启SSH
运行Docker
docker run --rm -p 8088:80 -p 6080:6080 --device=/dev/kvm --privileged webvirtcloud:test-2
8088
是 retspen/webvirtcloud 界面端口,启动后可以通过 NasIP:8088
访问,6080
是 VNC 端口,启动虚拟机后可以直接使用浏览器访问
启动libvirtd
由于我只修改了Dockerfile里的依赖,所以libvirtd只能手动启动,如果想要自动启动的可以添加启动脚本到 /etc/service
目录
-
进入Docker内部:
docker exec -it {镜像名} bash
-
修改配置文件: 使用 vi 打开
/etc/libvirt/libvirtd.conf
- unix_sock_group = "libvirt" + unix_sock_group = "www-data"
-
启动libvirtd:
libvirtd -d
-
启动virtlogd:
virtlogd -d
管理界面
通过 NasIP:8088
访问管理界面,默认用户名和密码都是 admin
接着继续点击右边的眼睛图案 -> 选择存储 -> 右上角的+号,添加两个存储
-
test: 路径为
/var/lib/libvirt/images
,用于存放虚拟机文件 -
iso: 路径为
/var/lib/libvirt/iso
,存放iso镜像文件
然后返回绿联Nas的ssh界面,复制iso文件到Docker内部,或者在执行Docker命令时使用 -v /mnt/xxxx/Docker/webvirtcloud/iso:/var/lib/libvirt/iso
将文件提前挂载到Docker内部
创建虚拟机
一切准备就绪,现在我们就能创建虚拟机了。
点击下一个,注意:webvirtcloud 这里的操作有些反人类,最好选择规格 -> 应用,不要使用自定义和模版,否则无法挂载CD-ROM。我这里选择30G的mini,存储一定要改成 test,然后创建
点击创建后会到实例页面,先不要启动,到设置 -> 磁盘挂载想要安装的系统iso文件,然后在旁边的启动顺序里确认启动第一项是iso所在的磁盘
接着就可以开机了,开机后可以点击访问 -> 控制台使用VNC打开系统安装界面,安装完成后记得重新调整启动顺序以及卸载iso镜像
至此,使用第三方Docker搭建的绿联Nas虚拟机管理也就完成了,如果急需使用虚拟机功能,又想保留绿联Nas的系统,随绿联一起“成长”的用户可以利用此功能创建虚拟机,如果不着急的可以等官方的实现
其它
-
没有修改libvirtd里的
unix_sock_group
配置为 www-dataFailed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied
-
Docker内部(不是绿联系统)执行
chmod 666 /dev/kvm
libvirt 错误- internal error: process exited while connecting to monitor: Could not access KVM kernel module: Permission denied 2023-07-05T16:17:57.942238Z qemu-system-x86_64: failed to initialize KVM: Permission denied
-
未安装dnsmasq,如果手动安装,使用
virsh net-start default
手动启动libbvirt 错误- Requested operation is not valid: network 'default' is not active
-
未安装qemu-utils
internal error: creation of non-raw file images is not supported without qemu-img.
注意:文章中并未修改绿联Nas本身的系统,所有的安装包和修改文件配置都是在Docker内部进行